package com.ruyuan.commodity.common.mamager;

import com.ruyuan.commodity.enums.PermissionEnums;
import com.ruyuan.commodity.model.goods.dos.GoodsDO;
import com.ruyuan.commodity.model.goods.dto.GoodsAuditParam;
import com.ruyuan.commodity.model.goods.request.GoodsInfoRequest;
import com.ruyuan.commodity.model.goods.vo.BackendGoodsVO;
import com.ruyuan.commodity.model.goods.vo.GoodsVO;
import com.ruyuan.commodity.open.api.model.trade.order.vo.OrderSkuVO;
import java.util.List;

/**
 * 商品业务层
 */
public interface GoodsManager {


    /**
     * 修改商品
     *
     * @param goodsInfoVO 商品
     * @param id      商品主键
     * @return Goods 商品
     */
    GoodsVO edit(GoodsInfoRequest goodsInfoVO, Long id);


    /**
     * 添加商品
     *
     * @param goodsInfoVO 商品对象
     * @return 商品对象
     */
    GoodsVO add(GoodsInfoRequest goodsInfoVO);

    /**
     * 商品下架
     *
     * @param goodsIds 商品id数组
     * @param reason 下架理由
     * @param permission 权限
     */
    void under(Long[] goodsIds, String reason, PermissionEnums permission);

    /**
     * 商品放入回收站
     *
     * @param goodsIds 商品id数组
     */
    void inRecycle(Long[] goodsIds);

    /**
     * 商品删除
     *
     * @param goodsIds 商品id数组
     */
    void delete(Long[] goodsIds);

    /**
     * 回收站还原商品
     *
     * @param goodsIds 商品id数组
     */
    void revert(Long[] goodsIds);

    /**
     * 上架商品
     *
     * @param goodsId 商品id
     */
    void up(Long goodsId);

    /**
     * 增加商品的浏览次数
     *
     * @param goodsId 商品id
     * @return 商品浏览次数
     */
    Integer visitedGoodsNum(Long goodsId);


    /**
     * 获取新增商品
     *
     * @param length 长度
     * @return 商品列表
     */
    List<BackendGoodsVO> newGoods(Integer length);

    /**
     * 获取商品是否使用检测的模版
     *
     * @param templateId 运费模板id
     * @return 商品
     */
    GoodsDO checkShipTemplate(Long templateId);

    /**
     * 更改商品类型
     *
     * @param sellerId 商家id
     * @param type 类型
     */
    void updateGoodsType(Long sellerId, String type);

    /**
     * 清除商品的关联<br/>
     * 在商品删除、下架要进行调用
     *
     * @param goodsId 商品id
     * @param markenable 上架
     */
    void cleanGoodsAssociated(long goodsId, Integer markenable);

}
